【SQL基礎】ORDER BY句 列番号による並べ替え
ORDER BY句では、並べ替えの基準となる「カラム名」を指定するのが一般的です。
参考:ORDER BY句の基本構文
一方で、ORDER BY句に「列番号」を指定して並べ替えを行うことも可能です。
列番号というのは、SELECT句で指定したカラムに対して1から順に振られた番号のことです。
以下の画像のような場合、nameカラム(赤枠)には1、ageカラム(青枠)には2の列番号が振られます。
この列番号を使うことで、並べ替えの基準となるカラムを指定することができます。
書式は以下の通りです。(昇順の場合)
SELECT データを取得するカラム名
FROM 対象テーブル名
ORDER BY 並べ替えの基準にする列番号 ASC;
※降順の場合は”ASC”のところを”DESC”としてください。
ただし、列番号による並べ替えは推奨されません。
どういう動作を意図しているのかがわかりにくいからです。
本記事では列番号による並べ替えを扱いますが、実際に使用する目的ではなく知見を深める目的でお読みいただきたいと思います。
本記事では例として以下のテーブル(テーブル名:teachers)を使用します。
1.SELECT句で特定のカラムを指定した場合
列番号はSELECT句で指定した順に振られます。
以下の二つの例で確認しましょう。
例1-1.teachersテーブルからnameカラムとageカラムを抽出し、ageカラムを基準に並べ替える(昇順)。
SELECT name, age FROM teachers ORDER BY 2 ASC;
例1-2.teachersテーブルからageカラムとnameカラムを抽出し、ageカラムを基準に並べ替える(昇順)。
SELECT age, name FROM teachers ORDER BY 1 ASC;
例1-1と例1-2ではSELECT句におけるカラム指定の順番を変えています。
例1-1ではageカラムの列番号は2ですが、例1-2ではageカラムの列番号は1です。
SELECT句の書き方によって指定する番号が変わるので、ORDER BY句だけを見ても何を基準に並べ替えているのかがわかりません。
2.SELECT句で全てのカラムを指定した場合
SELECT句で全てのカラムを指定した場合は、指定したテーブルの定義に従って列番号が振られます。
teachersテーブルの場合はidが1、nameが2、addressが3、ageが4、birthdayが5、scoreが6、studentsが7です。
例2.teachersテーブルから全てのカラムを抽出し、ageカラムを基準に並べ替える(昇順)。
SELECT * FROM teachers ORDER BY 4 ASC;
例2のような場合は、ORDER BY句、SELECT句を見ても何を基準に並べ替えているのかがわかりません。
学習のポイント
・ORDER BY句では列番号を指定することができる。
・意図する動作がわかりづらいため、列番号による並べ替えは基本的に使用するべきではない。
練習問題
以下からダウンロード可能です。
また、ダウンロードしたら以下のようにしてworldcup2014データベースを作成し、インポートしてください。
※worldcup2014.zip解凍してできるworldcup2014.sqlファイルをCドライブ直下に配置した場合。
worldcup2014.zip
[sql] CREATE DATABASE worldcup2014;use worldcup2014
source C:\worldcup2014.sql
[/sql]
1.2014年ワールドカップ開催時の世界ランキングを上位から順に表示してください。その際、ランキング、国名、グループ名の順に表示されるようにしてください。
countriesテーブル(id,name,ranking,group_nameの4つのカラムで構成されている)を使って答えを導いてください。